💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    1. 모델 요구사항 분석 | ✅ 저자: 이유정(박사)

    게시글(Post) 레스토랑 정보와는 별도로 콘텐츠성 게시글을 의미하며, 다음과 같은 칼럼이 포함됩니다:

    칼럼

    • 제목
    • 미리보기 이미지
    • 본문
    • 첫 페이지 노출 여부 (Boolean)
    • 발행 여부 (Boolean)
    • 생성 시간 (자동 생성)
    • 업데이트 시간 (자동 갱신)

    레스토랑(Restaurant) 레스토랑에 대한 핵심 정보와 다양한 관계를 포함하는 모델입니다:

    • ==태그(M2M)==
    • 이름 (최대 100자)
    • 지역 (ForeignKey → Region)
    • 지점 이름 (최대 100자)
    • 대표 이미지 (ImageField)
    • ==이미지(O2M)==
    • 소개 (최대 255자)
    • 주소
    • 평점 (Float, 예: 4.5)
    • 평가 수 (Integer, 예: 123)
    • 위치: 위도 (Latitude), 경도 (Longitude)
    • ==리뷰(O2M)==
    • ==블로그후기(O2M)==
    • ==메뉴(O2M)==
    • 영업 시간: 시작 시간, 종료 시간
    • 라스트 오더 시간
    • ==좋아요여부(O2M)==
    • 폐업 여부 (Boolean)
    • 특징 (CharField 또는 TextField)

    관련 관계 (OneToMany, ManyToMany 등)

    • 이미지들 (RestaurantImage - O2M)
    • 리뷰들 (Review - O2M)
    • 블로그 후기들 (BlogReview - O2M)
    • 메뉴들 (Menu - O2M)
    • 좋아요들 (RestaurantLike - O2M)
    • 태그들 (Tag - M2M)

    지역(Region) 레스토랑이 위치한 주소를 계층적으로 관리하는 모델입니다:

    • 광역시도 (예: 서울특별시)
    • 시군구 (예: 강남구)
    • 읍면동 (예: 역삼동)

    레스토랑 좋아요(RestaurantLike) 사용자가 특정 레스토랑을 '좋아요'한 내역입니다:

    • 레스토랑 (ForeignKey)
    • 사용자 (ForeignKey)
    • 생성 시간
    • 업데이트 시간

    태그(Tag) 레스토랑에 여러 태그를 부여할 수 있으며, 사용자별 태그 기록도 관리 가능합니다:

    • 이름
    • 레스토랑 (ForeignKey)
    • 사용자 (ForeignKey)
    • 생성 시간
    • 업데이트 시간

    레스토랑 이미지(RestaurantImage)

    • 레스토랑 (ForeignKey)
    • 이미지
    • 제목

    1단계: 비정규형

    • 하나의 레스토랑 row에 여러 메뉴, 이미지, 리뷰, 태그 등이 붙음
    • → 반복되는 값, 다중 컬럼으로 인한 데이터 중복과 갱신 이상(anomaly) 발생

    1차 정규화 (1NF)

    • 컬럼이 원자값을 가져야 함(더이상 쪼갤수 없는 하나의 값만 가져야 한다는뜻)
    • 반복되는 필드 → 각각 별도의 테이블로 분리
      RestaurantImage, RestaurantMenu, Review, Tag, ReviewImage, Article

    2차 정규화 (2NF)

    • 복합키의 부분 종속성 제거
    • 대부분의 테이블은 id가 단일 기본키이므로 큰 이슈 없음
    • 단, Tag는 "레스토랑 + 사용자"의 조합이 중복 없이 유지되어야 할 경우 복합키 고려 가능

    복합키란?

    • 기본키(PK)가 여러 컬럼을 묶어서 하나의 고유한 키가 되는 경우예요 예: Tag 테이블에서 restaurant_iduser_id 두 개를 묶어서 기본키로 사용할 수도 있어요. 이유? 같은 사용자(user)가 같은 레스토랑에 중복 태그를 달면 안 되게 만들고 싶을 때!

    부분 종속성 제거란?

    • 복합키(restaurant_id + user_id)의 일부 컬럼에만 의존하는 정보는 분리하라는 뜻이에요. 예를 들어 user_id만으로도 어떤 정보를 설명할 수 있다면, 그것은 Tag에서 분리해야 해요.

    3차 정규화 (3NF)

    • 이행적 종속 제거
    • 예: 주소에서 시도/시군구/읍면동 분리 → Region 테이블로 정규화

    최종 정규화된 10개의 테이블 목록
    번호 테이블 이름 설명
    1 Article 게시글(칼럼), 콘텐츠성 포스트
    2 Restaurant 레스토랑의 핵심 정보
    3 CuisineType 음식 종류 (예: 한식, 중식, 양식)
    4 RestaurantCategory 레스토랑 분류 (예: 고기, 샐러드) + 음식 종류 FK 포함
    5 RestaurantImage 레스토랑의 이미지들 (O2M 관계)
    6 RestaurantMenu 레스토랑의 메뉴들 (O2M 관계)
    7 Review 사용자 리뷰 (O2M, 평점 포함)
    8 ReviewImage 리뷰의 이미지들 (O2M 관계)
    9 SocialChannel 리뷰 출처 (인스타그램, 블로그 등)
    10 Tag 레스토랑에 연결된 태그 (ManyToMany)
    11 Region 지역 정보: 광역시도, 시군구, 읍면동
    • Restaurant
      RestaurantImage (O2M)
      RestaurantMenu (O2M)
      Review (O2M)
      Tag (M2M)
      RestaurantCategory (FK)
      Region (선택적으로 FK 가능)

    • Review
      ReviewImage (O2M)
      SocialChannel (FK)

    TOP
    preload preload